#define _GNU_SOURCE
#include "daemon_runner.h"
#include "daemon_sub_process.h"
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/reboot.h>
#include <fcntl.h>
#include <signal.h>

static int is_running = 1;
static sub_process_t *sub_processess[SUB_PROCESS_COUNT];
static int daemon_runnner_stop(int sig)
{
	is_running=0;
	return 0;
}

/**
 * 守护进程的主程序 
 * //初始化  并 检查启动 子进程
 * //1  程序后台化 daemon()
 * //2  重定向日志 把控制台的日志 重定向到日志文件
 * //3  注册终止信号的处理函数
 *  //4 初始化 子进程
 * // 5 启动子进程 
 * //6 收尾工作 退出
 */
int daemon_runner_start()
{

  //1  程序后台化 daemon()
	daemon(0, 1	); // 参数1 0 把e程序主目录改为/  参数2  0：关闭 输入输出错误 1 不关闭
  //2  重定向日志 把控制台的日志 重定向到日志文件
    //2.1 关闭 3个对应的文件描述符 
	close(STDIN_FILENO);
	close(STDOUT_FILENO);
	close(STDERR_FILENO);
	//2.2 打开 日志文件 占用对应 文件描述符
	open("/dev/null", O_RDWR);
	open(LOG_FILE,O_CREAT|O_WRONLY|O_APPEND, 0644); //占用标准输出
	open(LOG_FILE,O_CREAT|O_WRONLY|O_APPEND, 0644); //占用错误输出

  //3  注册终止信号的处理函数
	signal(SIGTERM,  daemon_runnner_stop);
    //4 初始化 子进程
	sub_process_t *sub_process_ota=  daemon_sub_process_init("ota");
	sub_process_t *sub_process_app=   daemon_sub_process_init("app");
	sub_processess[0]=sub_process_ota;
	sub_processess[1]=sub_process_app;
  // 5 检查并启动子进程 
    while(is_running)
   {
	   for(int i=0;i<SUB_PROCESS_COUNT;i++)
	   {
		   sub_process_t *sub_process=sub_processess[i];
		   daemon_sub_process_check_start(sub_process);
	   }
	   sleep(2);
   }

	// 6 有序退出
	for(int i=0;i<SUB_PROCESS_COUNT;i++)
	{
		sub_process_t *sub_process=sub_processess[i];
		daemon_sub_process_exit(sub_process);
	}
	return 0;



}